home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet multimedia / Muzyka / Edytory sampli (probek dzwieku) / ZynAddSubFX_2.2.0 / Setup_ZynAddSubFX-2.2.0.exe / source code / Misc / Config.C < prev    next >
C/C++ Source or Header  |  2005-04-08  |  10KB  |  334 lines

  1. /*
  2.   ZynAddSubFX - a software synthesizer
  3.  
  4.   Config.C - Configuration file functions
  5.   Copyright (C) 2003-2005 Nasca Octavian Paul
  6.   Author: Nasca Octavian Paul
  7.  
  8.   This program is free software; you can redistribute it and/or modify
  9.   it under the terms of version 2 of the GNU General Public License 
  10.   as published by the Free Software Foundation.
  11.  
  12.   This program is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.   GNU General Public License (version 2) for more details.
  16.  
  17.   You should have received a copy of the GNU General Public License (version 2)
  18.   along with this program; if not, write to the Free Software Foundation,
  19.   Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  20.  
  21. */
  22. #include <stdio.h>
  23. #include <math.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26.  
  27. #ifdef OS_WINDOWS
  28. #include <windows.h>
  29. #include <mmsystem.h>
  30. #endif
  31.  
  32. #include "Config.h"
  33. #include "XMLwrapper.h"
  34.  
  35. Config::Config(){
  36. };
  37. void Config::init(){
  38.     maxstringsize=MAX_STRING_SIZE;//for ui
  39.     //defaults
  40.     cfg.SampleRate=44100;
  41.     cfg.SoundBufferSize=256;
  42.     cfg.OscilSize=512;
  43.     cfg.SwapStereo=0;
  44.     
  45.     cfg.LinuxOSSWaveOutDev=new char[MAX_STRING_SIZE];
  46.     snprintf(cfg.LinuxOSSWaveOutDev,MAX_STRING_SIZE,"/dev/dsp");
  47.     cfg.LinuxOSSSeqInDev=new char[MAX_STRING_SIZE];
  48.     snprintf(cfg.LinuxOSSSeqInDev,MAX_STRING_SIZE,"/dev/sequencer");
  49.  
  50.     cfg.DumpFile=new char[MAX_STRING_SIZE];
  51.     snprintf(cfg.DumpFile,MAX_STRING_SIZE,"zynaddsubfx_dump.txt");
  52.  
  53.     cfg.WindowsWaveOutId=0;
  54.     cfg.WindowsMidiInId=0;
  55.     
  56.     cfg.BankUIAutoClose=0;
  57.     cfg.DumpNotesToFile=0;
  58.     cfg.DumpAppend=1;
  59.  
  60.     cfg.GzipCompression=3;
  61.  
  62.     cfg.Interpolation=0;
  63.     cfg.CheckPADsynth=1;
  64.  
  65.     cfg.UserInterfaceMode=0;
  66.     cfg.VirKeybLayout=1;
  67.     winwavemax=1;winmidimax=1;
  68. //try to find out how many input midi devices are there
  69. #ifdef WINMIDIIN
  70.     winmidimax=midiInGetNumDevs();
  71.     if (winmidimax==0) winmidimax=1;
  72. #endif
  73.     winmididevices=new winmidionedevice[winmidimax];
  74.     for (int i=0;i<winmidimax;i++) {
  75.     winmididevices[i].name=new char[MAX_STRING_SIZE];
  76.     for (int j=0;j<MAX_STRING_SIZE;j++) winmididevices[i].name[j]='\0';
  77.     };
  78.  
  79.  
  80. //get the midi input devices name
  81. #ifdef WINMIDIIN
  82.     MIDIINCAPS midiincaps;
  83.     for (int i=0;i<winmidimax;i++){
  84.     if (! midiInGetDevCaps(i,&midiincaps,sizeof(MIDIINCAPS)))
  85.         snprintf(winmididevices[i].name,MAX_STRING_SIZE,"%s",midiincaps.szPname);
  86.     };
  87. #endif
  88.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++) cfg.bankRootDirList[i]=NULL;
  89.     cfg.currentBankDir=new char[MAX_STRING_SIZE];
  90.     sprintf(cfg.currentBankDir,"./testbnk");
  91.     
  92.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++) cfg.presetsDirList[i]=NULL;
  93.     
  94.     char filename[MAX_STRING_SIZE];
  95.     getConfigFileName(filename,MAX_STRING_SIZE);
  96.     readConfig(filename);
  97.  
  98.     if (cfg.bankRootDirList[0]==NULL){
  99. #if defined(OS_LINUX)
  100.     //banks
  101.         cfg.bankRootDirList[0]=new char[MAX_STRING_SIZE];
  102.     sprintf(cfg.bankRootDirList[0],"~/banks");
  103.  
  104.     cfg.bankRootDirList[1]=new char[MAX_STRING_SIZE];
  105.     sprintf(cfg.bankRootDirList[1],"./");
  106.  
  107.         cfg.bankRootDirList[2]=new char[MAX_STRING_SIZE];
  108.     sprintf(cfg.bankRootDirList[2],"/usr/share/zynaddsubfx/banks");
  109.  
  110.     cfg.bankRootDirList[3]=new char[MAX_STRING_SIZE];
  111.     sprintf(cfg.bankRootDirList[3],"/usr/local/share/zynaddsubfx/banks");
  112.  
  113.     cfg.bankRootDirList[4]=new char[MAX_STRING_SIZE];
  114.     sprintf(cfg.bankRootDirList[4],"../banks");
  115.  
  116.     cfg.bankRootDirList[5]=new char[MAX_STRING_SIZE];
  117.     sprintf(cfg.bankRootDirList[5],"banks");
  118.     
  119. #else
  120.     //banks
  121.     cfg.bankRootDirList[0]=new char[MAX_STRING_SIZE];
  122.     sprintf(cfg.bankRootDirList[0],"./");
  123.  
  124. #ifdef VSTAUDIOOUT
  125.     cfg.bankRootDirList[1]=new char[MAX_STRING_SIZE];
  126.     sprintf(cfg.bankRootDirList[1],"c:/Program Files/ZynAddSubFX/banks");
  127. #else
  128.     cfg.bankRootDirList[1]=new char[MAX_STRING_SIZE];
  129.     sprintf(cfg.bankRootDirList[1],"../banks");
  130. #endif
  131.     cfg.bankRootDirList[2]=new char[MAX_STRING_SIZE];
  132.     sprintf(cfg.bankRootDirList[2],"banks");
  133.     
  134. #endif
  135.     };
  136.  
  137.     if (cfg.presetsDirList[0]==NULL){
  138. #if defined(OS_LINUX)
  139.     //presets
  140.     cfg.presetsDirList[0]=new char[MAX_STRING_SIZE];
  141.     sprintf(cfg.presetsDirList[0],"./");
  142.  
  143.     cfg.presetsDirList[1]=new char[MAX_STRING_SIZE];
  144.     sprintf(cfg.presetsDirList[1],"../presets");
  145.  
  146.     cfg.presetsDirList[2]=new char[MAX_STRING_SIZE];
  147.     sprintf(cfg.presetsDirList[2],"presets");
  148.     
  149.         cfg.presetsDirList[3]=new char[MAX_STRING_SIZE];
  150.     sprintf(cfg.presetsDirList[3],"/usr/share/zynaddsubfx/presets");
  151.  
  152.     cfg.presetsDirList[4]=new char[MAX_STRING_SIZE];
  153.     sprintf(cfg.presetsDirList[4],"/usr/local/share/zynaddsubfx/presets");
  154.     
  155. #else
  156.     //presets
  157.     cfg.presetsDirList[0]=new char[MAX_STRING_SIZE];
  158.     sprintf(cfg.presetsDirList[0],"./");
  159.  
  160. #ifdef VSTAUDIOOUT
  161.     cfg.presetsDirList[1]=new char[MAX_STRING_SIZE];
  162.     sprintf(cfg.presetsDirList[1],"c:/Program Files/ZynAddSubFX/presets");
  163. #else
  164.     cfg.presetsDirList[1]=new char[MAX_STRING_SIZE];
  165.     sprintf(cfg.presetsDirList[1],"../presets");
  166. #endif
  167.  
  168.     cfg.presetsDirList[2]=new char[MAX_STRING_SIZE];
  169.     sprintf(cfg.presetsDirList[2],"presets");
  170. #endif
  171.     };
  172.  
  173. };
  174.  
  175. Config::~Config(){
  176.  
  177.     delete(cfg.LinuxOSSWaveOutDev);
  178.     delete(cfg.LinuxOSSSeqInDev);
  179.     delete(cfg.DumpFile);
  180.  
  181.     for (int i=0;i<winmidimax;i++) delete (winmididevices[i].name);
  182.     delete(winmididevices);
  183. };
  184.  
  185.  
  186. void Config::save(){
  187.     char filename[MAX_STRING_SIZE];
  188.     getConfigFileName(filename,MAX_STRING_SIZE);
  189.     saveConfig(filename);
  190. };
  191.  
  192. void Config::clearbankrootdirlist(){
  193.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++) {
  194.     if (cfg.bankRootDirList[i]==NULL) delete(cfg.bankRootDirList[i]);
  195.     cfg.bankRootDirList[i]=NULL;
  196.     };
  197. };
  198.  
  199. void Config::clearpresetsdirlist(){
  200.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++) {
  201.     if (cfg.presetsDirList[i]==NULL) delete(cfg.presetsDirList[i]);
  202.     cfg.presetsDirList[i]=NULL;
  203.     };
  204. };
  205.  
  206. void Config::readConfig(char *filename){
  207.     XMLwrapper *xmlcfg=new XMLwrapper();
  208.     if (xmlcfg->loadXMLfile(filename)<0) return;
  209.     if (xmlcfg->enterbranch("CONFIGURATION")){
  210.     cfg.SampleRate=xmlcfg->getpar("sample_rate",cfg.SampleRate,4000,1024000);
  211.     cfg.SoundBufferSize=xmlcfg->getpar("sound_buffer_size",cfg.SoundBufferSize,16,8192);
  212.     cfg.OscilSize=xmlcfg->getpar("oscil_size",cfg.OscilSize,MAX_AD_HARMONICS*2,131072);
  213.     cfg.SwapStereo=xmlcfg->getpar("swap_stereo",cfg.SwapStereo,0,1);
  214.     cfg.BankUIAutoClose=xmlcfg->getpar("bank_window_auto_close",cfg.BankUIAutoClose,0,1);
  215.  
  216.     cfg.DumpNotesToFile=xmlcfg->getpar("dump_notes_to_file",cfg.DumpNotesToFile,0,1);
  217.     cfg.DumpAppend=xmlcfg->getpar("dump_append",cfg.DumpAppend,0,1);
  218.     xmlcfg->getparstr("dump_file",cfg.DumpFile,MAX_STRING_SIZE);
  219.  
  220.     cfg.GzipCompression=xmlcfg->getpar("gzip_compression",cfg.GzipCompression,0,9);
  221.  
  222.     xmlcfg->getparstr("bank_current",cfg.currentBankDir,MAX_STRING_SIZE);
  223.     cfg.Interpolation=xmlcfg->getpar("interpolation",cfg.Interpolation,0,1);
  224.  
  225.     cfg.CheckPADsynth=xmlcfg->getpar("check_pad_synth",cfg.CheckPADsynth,0,1);
  226.  
  227.  
  228.     cfg.UserInterfaceMode=xmlcfg->getpar("user_interface_mode",cfg.UserInterfaceMode,0,2);
  229.     cfg.VirKeybLayout=xmlcfg->getpar("virtual_keyboard_layout",cfg.VirKeybLayout,0,10);
  230.  
  231.     //get bankroot dirs
  232.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++){
  233.         if (xmlcfg->enterbranch("BANKROOT",i)){
  234.           cfg.bankRootDirList[i]=new char[MAX_STRING_SIZE];
  235.           xmlcfg->getparstr("bank_root",cfg.bankRootDirList[i],MAX_STRING_SIZE);
  236.          xmlcfg->exitbranch();
  237.         };
  238.     };
  239.  
  240.     //get preset root dirs
  241.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++){
  242.         if (xmlcfg->enterbranch("PRESETSROOT",i)){
  243.           cfg.presetsDirList[i]=new char[MAX_STRING_SIZE];
  244.           xmlcfg->getparstr("presets_root",cfg.presetsDirList[i],MAX_STRING_SIZE);
  245.          xmlcfg->exitbranch();
  246.         };
  247.     };
  248.  
  249.     //linux stuff
  250.     xmlcfg->getparstr("linux_oss_wave_out_dev",cfg.LinuxOSSWaveOutDev,MAX_STRING_SIZE);
  251.     xmlcfg->getparstr("linux_oss_seq_in_dev",cfg.LinuxOSSSeqInDev,MAX_STRING_SIZE);
  252.     
  253.     //windows stuff
  254.     cfg.WindowsWaveOutId=xmlcfg->getpar("windows_wave_out_id",cfg.WindowsWaveOutId,0,winwavemax);
  255.     cfg.WindowsMidiInId=xmlcfg->getpar("windows_midi_in_id",cfg.WindowsMidiInId,0,winmidimax);
  256.  
  257.  
  258.  
  259.       xmlcfg->exitbranch();
  260.     };
  261.     delete(xmlcfg);
  262.  
  263.     cfg.OscilSize=(int) pow(2,ceil(log (cfg.OscilSize-1.0)/log(2.0)));
  264.  
  265. };
  266.  
  267. void Config::saveConfig(char *filename){
  268.     XMLwrapper *xmlcfg=new XMLwrapper();
  269.     
  270.     xmlcfg->beginbranch("CONFIGURATION");    
  271.     
  272.     xmlcfg->addpar("sample_rate",cfg.SampleRate);
  273.     xmlcfg->addpar("sound_buffer_size",cfg.SoundBufferSize);
  274.     xmlcfg->addpar("oscil_size",cfg.OscilSize);
  275.     xmlcfg->addpar("swap_stereo",cfg.SwapStereo);
  276.     xmlcfg->addpar("bank_window_auto_close",cfg.BankUIAutoClose);
  277.  
  278.     xmlcfg->addpar("dump_notes_to_file",cfg.DumpNotesToFile);
  279.     xmlcfg->addpar("dump_append",cfg.DumpAppend);
  280.     xmlcfg->addparstr("dump_file",cfg.DumpFile);
  281.  
  282.     xmlcfg->addpar("gzip_compression",cfg.GzipCompression);
  283.  
  284.     xmlcfg->addpar("check_pad_synth",cfg.CheckPADsynth);
  285.  
  286.     xmlcfg->addparstr("bank_current",cfg.currentBankDir);
  287.  
  288.     xmlcfg->addpar("user_interface_mode",cfg.UserInterfaceMode);
  289.     xmlcfg->addpar("virtual_keyboard_layout",cfg.VirKeybLayout);
  290.  
  291.  
  292.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++) if (cfg.bankRootDirList[i]!=NULL) {
  293.         xmlcfg->beginbranch("BANKROOT",i);
  294.          xmlcfg->addparstr("bank_root",cfg.bankRootDirList[i]);
  295.         xmlcfg->endbranch();
  296.     };
  297.  
  298.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++) if (cfg.presetsDirList[i]!=NULL) {
  299.         xmlcfg->beginbranch("PRESETSROOT",i);
  300.          xmlcfg->addparstr("presets_root",cfg.presetsDirList[i]);
  301.         xmlcfg->endbranch();
  302.     };
  303.  
  304.     xmlcfg->addpar("interpolation",cfg.Interpolation);
  305.  
  306.     //linux stuff
  307.     xmlcfg->addparstr("linux_oss_wave_out_dev",cfg.LinuxOSSWaveOutDev);
  308.     xmlcfg->addparstr("linux_oss_seq_in_dev",cfg.LinuxOSSSeqInDev);
  309.     
  310.     //windows stuff
  311.     xmlcfg->addpar("windows_wave_out_id",cfg.WindowsWaveOutId);
  312.     xmlcfg->addpar("windows_midi_in_id",cfg.WindowsMidiInId);
  313.  
  314.     xmlcfg->endbranch();
  315.     
  316.     int tmp=cfg.GzipCompression;
  317.     cfg.GzipCompression=0;
  318.     xmlcfg->saveXMLfile(filename);
  319.     cfg.GzipCompression=tmp;
  320.     
  321.     delete(xmlcfg);
  322. };
  323.  
  324. void Config::getConfigFileName(char *name, int namesize){
  325.     name[0]=0;
  326. #ifdef OS_LINUX
  327.     snprintf(name,namesize,"%s%s",getenv("HOME"),"/.zynaddsubfxXML.cfg");
  328. #else
  329.     snprintf(name,namesize,"%s","zynaddsubfxXML.cfg");
  330. #endif
  331.  
  332. };
  333.  
  334.